package com.hedl.practice.diyJava.multithreading.forkJoin.utils;

import java.util.concurrent.RecursiveTask;

public class SumTask extends RecursiveTask<Long> {
    static final int THRESHOLD = 500;
    long[] array;
    int start;
    int end;

    public SumTask(long[] array, int start, int end) {
        this.array = array;
        this.start = start;
        this.end = end;
    }


    @Override
    protected Long compute() {
        if (end - start <= THRESHOLD){
            //如果任务足够小，字节计算
            long sum = 0;
            for (int i = start;i < end; i++){
                sum += this.array[i];
                //故意放慢计算速度
                try{
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                }
            }
            return sum;
        }
        //任务太大，一分为二
        int middle = (end + start) /2;
        System.out.println(String.format("split %d~%d ==> %d~%d",start,end,start,middle,middle,end));
        SumTask subtask1 = new SumTask(this.array,start,middle);
        SumTask subtask2 = new SumTask(this.array,middle,end);
        //isDone给定的任务，当 isDone为每个任务保留或者遇到（未经检查的）异常时返回，在这种情况下重新抛出异常。
        invokeAll(subtask1,subtask2);       //isDone：如果此任务完成，则返回true 。 完成可能是由于正常终止，例外或取消 - 在所有这些情况下，此方法将返回true 。
        Long subresult1 = subtask1.join();      //返回is done时的计算结果
        Long subresult2 = subtask2.join();
        Long result = subresult1 + subresult2;
        System.out.println("result = "+subresult1+"+"+subresult2+"==>"+result);
        return result;
    }
}
